//知识点1：使用参数初始化列表initializerlist也可以定义一个可接受可变参数数目的函数，但是所有的实参都必须具有相同的类型（或者可转变为相同的类型）

// 知识点2：可变参数函数通常是递归的，第一步调用处理包中第一个实参，然后用剩余实参调用自身，所以我们在递归函数中，需要定义一个非可变参数版本版本的函数，以防无限递归
#include <iostream>
#include <string>
template <typename T>
//非可变参数版本，递归的最后一次调用会选择该版本，因为比较特例化
std::ostream &print(std::ostream &os, const T &t) {
  return os << t;
}
template <typename T, typename... Args>
std::ostream &print(std::ostream &os, const T &t, const Args &... args) {
  os << t << ", ";
  return print(os, args...);
}

int main() {
  using namespace std;
  int a = 1;
  double d = 2.2;
  string s = "c++ primer";

  print(cout, 42) << endl;
  print(cout, 42, d) << endl;
  print(cout, 42, d, s, "hello", 'w') << endl;
  system("pause");
  return 0;
}